from datetime import datetime

import wx
import sys, os
from openpyxl import load_workbook

from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
import qrcode

"""
根据Excel表数据生成图片
"""
# ---------------------------------------------------------------------------

# 限制文件类型 为excel 文件
wildcard = "excel文件 (*.xlsx)|*.xlsx|" \
           "所有文件 (*.*)|*.*"


# ---------------------------------------------------------------------------

class Window(wx.Frame):
    # 全局变量
    # g_path = "显示文件路径"

    # 构造函数
    def __init__(self):
        # 界面布局
        wx.Frame.__init__(self, None, title="生成图片", pos=(250, 250), size=(600, 200))
        # 创建面板
        panel = wx.Panel(self)
        # 显示文件路径
        self.path = wx.TextCtrl(panel, value="显示文件路径", pos=(80, 12), size=(480, 25), style=wx.TE_READONLY)
        self.save_path = wx.TextCtrl(panel, value="显示保存文件路径", pos=(80, 52), size=(480, 25),
                                     style=wx.TE_READONLY)
        self.total = wx.TextCtrl(panel, value="显示图片数", pos=(80, 92), size=(480, 25), style=wx.TE_READONLY)

        # 创建按钮
        # 获取Excel数据按钮
        self.select_file_btn = wx.Button(panel, label="选择文件", pos=(10, 10), size=(60, 30))
        self.Bind(wx.EVT_BUTTON, self.select_file, self.select_file_btn)  # 绑定事件
        # 处理数据按钮
        self.handle_excel_data_btn = wx.Button(panel, label="生成图片", pos=(10, 90), size=(60, 30))
        self.Bind(wx.EVT_BUTTON, self.handle_excel_data, self.handle_excel_data_btn)
        #
        # self.create_image_btn = wx.Button(panel, label="生成图片", pos=(10, 90), size=(60, 30))
        # self.Bind(wx.EVT_BUTTON, self.create_image, self.create_image_btn)
        #
        # self.create_qrcode_btn = wx.Button(panel, label="生成二维码", pos=(10, 130), size=(60, 30))
        # self.Bind(wx.EVT_BUTTON, self.create_qrcode, self.create_qrcode_btn)

        # 选择保存路径按钮
        self.save_path_btn = wx.Button(panel, label="保存路径", pos=(10, 50), size=(60, 30))
        self.Bind(wx.EVT_BUTTON, self.select_save_path, self.save_path_btn)

    # 事件方法
    # -------------------- select_file 开始 ---------------------------------------------------------------------

    # 选择文件
    def select_file(self, event):

        # wx.FD_OPEN：指定文件对话框用于打开文件。这是默认值，通常不需要显式指定。
        # wx.FD_CHANGE_DIR: 指定文件对话框在打开文件后改变当前工作目录。
        # wx.FD_FILE_MUST_EXIST：指定文件对话框必须选择一个存在的文件。

        # 创建文件选择框
        dlg = wx.FileDialog(
            self, message="选择一个文件",
            defaultDir=os.getcwd(),
            defaultFile="",
            wildcard=wildcard,
            style=wx.FD_OPEN |
                  wx.FD_CHANGE_DIR |
                  wx.FD_FILE_MUST_EXIST
        )
        # 显示文件选择框
        if dlg.ShowModal() == wx.ID_OK:
            path = dlg.GetPath()
            # 显示选择的文件路径
            self.path.SetLabel(path)
            print('选择文件路径: ', path)

        dlg.Destroy()

    # -------------------- select_file 结束 ---------------------------------------------------------------------

    # -------------------- select_save_files  开始 ---------------------------------------------------------------------
    # 选择保存文件路径
    def select_save_path(self, event):
        dlg = wx.DirDialog(self, "选择一个目录", style=wx.DD_DEFAULT_STYLE)
        if dlg.ShowModal() == wx.ID_OK:
            path = dlg.GetPath()
            self.save_path.SetLabel(path)
            print('选择文件路径: ', path)

        dlg.Destroy()

    # -------------------- select_file 结束 ---------------------------------------------------------------------

    # -------------------- handle_excel_data 开始 ---------------------------------------------------------------------
    # 处理 excel数据
    def handle_excel_data(self, event):
        print("处理 excel数据", self.path.GetValue())
        # 加载工作簿
        workbook = load_workbook(filename=self.path.GetValue())
        sheet = workbook.worksheets[0]  # 直接通过索引访问第一个工作表

        print_total = 0
        # 遍历工作表 iter_rows 范围从第2行(min_row=2)到最后一行(max_row=sheet.max_row)。
        # 每行的所有列都包含在内，范围从第1列(min_col=1)到最后一列(max_col=sheet.max_column)
        for row in sheet.iter_rows(min_row=2, max_row=sheet.max_row, min_col=1, max_col=sheet.max_column):
            print_total += 1
            uid = row[1].value or ''
            name = row[2].value or ''
            code = row[3].value or ''
            band = row[5].value or ''
            model = row[6].value or ''
            seq_num = row[7].value or ''
            print("uid", uid,"name", name,"code",code,"band",band,"model",model,"seq_num",seq_num)
            self.create_image(str(event), str(uid), str(name), str(code), str(band), str(model), str(seq_num))

        self.total.SetLabel("保存图片数: " + str (print_total))
        print("总行数: ", sheet.max_row)

    # -------------------- handle_excel_data 结束 ---------------------------------------------------------------------

    # 生成二维码
    def create_qrcode(self, event, uid):
        qr_size = 130  # 二维码大小
        # print("生成二维码")
        # 创建QRCode对象
        qr = qrcode.QRCode(
            version=1,  # 控制二维码的大小，1是最小的
            error_correction=qrcode.constants.ERROR_CORRECT_L,  # 控制二维码的错误纠正级别
            box_size=10,  # 控制二维码中每个小格子的大小
            border=0,  # 控制边框（二维码与图片边界的距离）的宽度
        )

        # 添加数据到QRCode对象
        qr.add_data(uid)
        qr.make(fit=True)

        # 创建图像
        img = qr.make_image(fill_color="black", back_color="white")

        # 调整二维码大小
        img = img.resize((qr_size, qr_size), Image.Resampling.LANCZOS)

        return img

    def create_image(self, event, uid, name, code, band, model, seq_num):
        position = (260, 60)  # 二维码在背景图片上的位置
        qrcode_img = self.create_qrcode(event, uid)
        # 字体文件路径为
        font_path_sonti = 'C:/Windows/Fonts/simfang.ttf'
        font_path_heiti = 'C:/Windows/Fonts/simhei.ttf'

        # print("生成图片")
        # 创建一个新的白色图片
        width = 400
        height = 200
        # 创建图像
        image = Image.new('RGB', (width, height), color='white')

        # 创建一个可以操作上面图片的对象
        draw = ImageDraw.Draw(image)

        # 打开一个字体文件
        font_sonti = ImageFont.truetype(font_path_sonti, 16)  # 宋体
        font_heiti = ImageFont.truetype(font_path_heiti, 24)  # 黑体

        # 定义长方形的坐标
        rectangle_coords = (1, 1, 399, 199)  # 左上角 (10, 10)，右下角 (60, 40)
        # 绘制长方形
        draw.rectangle(rectangle_coords, outline='black', width=2)  # 黑色边框，宽度为 2 像素

        # 绘制文字
        draw.text((115, 10), "固定资产信息", fill=(0, 0, 0), font=font_heiti)

        draw.text((10, 60), "资产编码:", fill=(0, 0, 0), font=font_sonti)
        draw.text((10, 85), "资产名称:", fill=(0, 0, 0), font=font_sonti)
        draw.text((10, 110), "品  牌:", fill=(0, 0, 0), font=font_sonti)
        draw.text((10, 135), "规格型号:", fill=(0, 0, 0), font=font_sonti)
        draw.text((10, 160), "设备序列号:", fill=(0, 0, 0), font=font_sonti)

        if code is not None:
            draw.text((100, 60), code, fill=(0, 0, 0), font=font_sonti)  # 资产编码
        if name is not None:
            draw.text((100, 85), name, fill=(0, 0, 0), font=font_sonti)  # 资产名称
        if band is not None:
            draw.text((100, 110), band, fill=(0, 0, 0), font=font_sonti)  # 品牌
        if  model is not None:
            draw.text((100, 135), model, fill=(0, 0, 0), font=font_sonti)  # 规格型号
        if seq_num is not None:
            draw.text((100, 160), seq_num, fill=(0, 0, 0), font=font_sonti)  # 设备序列号

        # 将二维码粘贴到背景图片上
        image.paste(qrcode_img, position)

        # 获取当前时间
        now = datetime.now().strftime("%H_%M_%S")
        # 将图像转换为24色位图
        image = image.quantize(colors=24)

        img_name = name + '_' + code + '.bmp'
        full_path = f"{self.save_path.GetValue()}\\{img_name}"
        print("保存路径:", full_path)

        # 保存图片
        image.save(full_path, format='BMP')


# ---------------------------------------------------------------------------


# ---------------------------------------------------------------------------


# 程序入口
if __name__ == '__main__':
    # 创建应用程序对象
    app = wx.App()
    # 创建窗口
    window = Window()
    # 显示窗口
    window.Show()
    # 循环显示
    app.MainLoop()
